var config = require('./config')

var json = require('./utils/func.js');
var md5 = require('./utils/md5.js');
var RSA = require('./utils/wx_rsa.js');

//app.js
App({
  onLaunch: function() {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        if (res.code) {
          //发起网络请求
          wx.request({
            url: config.service.loginUrl,
            method: 'GET',
            data: {
              code: res.code
            },
            success: function(data) {
              console.log(data);
            },
            error: function(data) {
              console.log(data);
            }
          })
        } else {
          console.log('登录失败！' + res.errMsg)
        }
        var str = "test";
        str.toUpperCase();
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权，可以直接调用 getUserInfo 获取头像昵称，不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo

              // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },
  globalData: {
    userInfo: null
  },
  //MD5加密
  md5: function(str) {
    return md5.hex_md5(str);
  },
  /**
   * 签名
   * @param data 要签名的数据，可以是字符串，数组或json对象
   */
  sign: function(data) {
    var str = '';
    if (typeof(data) === 'string') {
      str = data;
    }
    if (data instanceof Array || data instanceof Object) {
      str = json.jsonURLParams(data);
    }

    console.log("要签名的数据：" + str + ",数据类型为：" + typeof(data));
    var sign_rsa = new RSA.RSAKey();
    sign_rsa = RSA.KEYUTIL.getKey(config.rsa.privateKey);

    var sign = sign_rsa.signString(str, config.rsa.hashAlg);
    sign = RSA.hex2b64(sign); // hex 转 b64
    return sign;
  },
  /**
   * 验签
   * @param data 参与签名的数据
   * @param sign 签名
   * @return bool 
   */
  verify: function(data, sign) {
    var str = '';
    if (typeof(data) === 'string') {
      str = data;
    }
    if (data instanceof Array || data instanceof Object) {
      str = json.jsonURLParams(data);
    }
    console.log("参与签名的数据：" + str + ",数据类型为：" + typeof(data) + ';\n签名：' + sign);
    if (typeof(sign) !== 'string' || sign.length <= 0) {
      return false;
    }

    var verify_rsa = new RSA.RSAKey();
    verify_rsa = RSA.KEYUTIL.getKey(config.rsa.publicKey);

    sign = RSA.b64tohex(sign)
    var ver = verify_rsa.verifyString(str, sign)
    return ver;

  },
  /**
   * 加密
   * @param data 要加密的数据，如果未字符串，直接加密；否则，转成json格式字符串加密。
   */
  encrypt: function(data) {
    var str = '';
    if (typeof(data) === 'string') {
      str = data;
    }
    if (data instanceof Array || data instanceof Object) {
      str = JSON.stringify(data);

    }
    console.log("要加密的数据：" + str + ",数据类型为：" + typeof(data));

    var encrypt_rsa = new RSA.RSAKey();
    encrypt_rsa = RSA.KEYUTIL.getKey(config.rsa.publicKey);

    var encStr = encrypt_rsa.encrypt(str);
    encStr = RSA.hex2b64(encStr);
    return encStr;
  },
  /**
   * 解密
   * @param string data 要解密的数据，只能是字符串
   */
  decrypt: function(data) {
    console.log("密文：" + data);

    if (typeof(data) === 'string') {
      var decrypt_rsa = new RSA.RSAKey();
      decrypt_rsa = RSA.KEYUTIL.getKey(config.rsa.privateKey);

      data = RSA.b64tohex(data);

      var decStr = decrypt_rsa.decrypt(data);

      return decStr;
    } else {
      wx.showToast({
        title: '请先加密',
        icon: 'loading',
        duration: 1000
      });
      return null;
    }
  }
})